﻿using System;
using System.Collections.Generic;
using System.Text;

using Galaxy.ModuleInterface.Events;
using Galaxy.ModuleInterface.Messages;

namespace Galaxy.ModuleInterface
{
    /// <summary>Модуль Галактики</summary>
    public abstract partial class CGalaxyModule : MarshalByRefObject, IGalaxyModule
    {
        /* --------------------------------------------------------------------- */

        /// <summary>Имя модуля</summary>
        private string f_Name = "";

        /// <summary>Список известных модулей</summary>
        private CGalaxyModuleList fConnectedModules = new CGalaxyModuleList();

        /* --------------------------------------------------------------------- */

        #region Свойства

        /// <summary>Модуль по умолчанию проинициализирован</summary>
        public virtual bool Initialized { get { return true; } }

        /// <summary>Модуль по умолчанию включён</summary>
        public virtual bool Enable { get { return true; } set { } }

        /// <summary>Список подключённых модулей</summary>
        public virtual CGalaxyModuleList ConnectedModules
        {
            get { return fConnectedModules; }
        }

        /// <summary>Имя модуля</summary>
        public virtual string Name
        {
            get { return f_Name; }
            set { f_Name = value; }
        }

        #endregion

        /* --------------------------------------------------------------------- */

        public CGalaxyModule() { }

        public CGalaxyModule(string Name) { f_Name = Name; }

        /* --------------------------------------------------------------------- */

        #region Методы

        /// <summary>Запуск модуля</summary>
        public abstract void Start();

        /// <summary>Остановка модуля</summary>
        public abstract void Stop();

        /// <summary>Инициализация модуля</summary>
        public abstract void Initialize();

        /// <summary>Обработка сообщения</summary>
        /// <param name="Message">Сообщение</param>
        public virtual void ProcessMessage(IGalaxyModuleMessage Message)
        {
            if( Message is CStartModuleMessage ) Start();
            if( Message is CStopModuleMessage ) Stop();
            if( Message is CInitializeModuleMessage ) Initialize();
        }

        /// <summary>Подключение к модулю</summary>
        /// <param name="Module">Подключаемый модуль</param>
        public virtual void Connect(IGalaxyModule Module)
        {
            if( fConnectedModules.Contains(Module) || Module == this ) return;
            this.NewMessage += Module.ReceiveMessage;
            fConnectedModules.Add(Module);
            Module.Connect(this);
        }

        /// <summary>Отключение от модуля</summary>
        /// <param name="Module">Отключаемый модуль</param>
        public virtual void Disconnect(IGalaxyModule Module)
        {
            if( fConnectedModules.Contains(Module) )
            {
                if( !fConnectedModules.Contains(Module) ) return;
                this.NewMessage -= Module.ReceiveMessage;
                fConnectedModules.Remove(Module);
                Module.Disconnect(this);
            }
        }

        #endregion

        /* --------------------------------------------------------------------- */

        public override string ToString()
        {
            return Name == "" ? base.ToString() : Name;
        }
    }
}
